/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dto.LoteSementeDTO;

/**
 *
 * @author Gabriel
 */
public class LoteSementeDAO extends DAO {

    public static String SELECT_LOTE_SEMENTE =
                                    ""; // TODO: Incorporar select de negócio



    /**
    * Construtor que inicializa o Connector (interface com o Banco)
    */
    public LoteSementeDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    private LoteSementeDTO getLoteSementeCorrenteResultSet(ResultSet rs) throws SQLException {
        LoteSementeDTO loteSementeDTO = new LoteSementeDTO();
        loteSementeDTO.setId(rs.getInt("Id"));
        loteSementeDTO.setPesoInicial(rs.getDouble("Peso_Inicial"));
        loteSementeDTO.setPesoAtual(rs.getDouble("Peso_Atual"));
        loteSementeDTO.setFlgEncerrado(rs.getBoolean("Flg_Encerrado"));
        loteSementeDTO.setColeta(rs.getInt("Id_Coleta"), rs.getDate("Data_Coleta"));        
        loteSementeDTO.setEspecie(rs.getInt("Id_Matriz"), rs.getString("Nome_Cientifico"), rs.getString("Nome_Vulgar"));
        return loteSementeDTO;
    }

    private LinkedList<LoteSementeDTO> getLotesSementeResultSet(ResultSet rs) throws SQLException {
        LinkedList<LoteSementeDTO> loteSementeDTOs = new LinkedList<LoteSementeDTO>();
        while (rs.next()) {
            loteSementeDTOs.add(getLoteSementeCorrenteResultSet(rs));
        }
        return loteSementeDTOs;
    }

    public LinkedList<LoteSementeDTO> pesquisaLoteSemente(Integer id,
                                                          Date dataColeta,
                                                          Boolean flgEncerrado,
                                                          Integer idMatriz,
                                                          String nomeEspecie) throws SQLException {
        sql = SELECT_LOTE_SEMENTE;

        if (id != null) {
            sql += "  AND ls.Id = " + id + "\n";
        }

        if (dataColeta != null) {
            sql += "  AND ls.Data_Coleta = " + dataColeta + "\n";
        }

        if (flgEncerrado != null) {
            sql += "  AND ls.Flg_Encerrado = " + flgEncerrado + "\n";
        }

        if (idMatriz != null) {
            sql += "  AND m.Id = " + idMatriz + "\n";
        }

        if (nomeEspecie != null) {
            sql += " AND (e.nome_cientifico like '%" + nomeEspecie + "%' OR e.nome_vulgar like '%" + nomeEspecie + "%')\n";
        }

        sql += ";";

        resultSet = connector.executeSelectQuery(sql);

        return getLotesSementeResultSet(resultSet);

    }

    public void insereLoteSemente(LoteSementeDTO loteSementeDTO) throws SQLException {
        sql = "INSERT INTO LOTE_SEMENTE(Id_Coleta, Peso_Inicial, Peso_Atual, Flg_Encerrado)" +
              "VALUES ("+loteSementeDTO.getIdColeta()+","+loteSementeDTO.getPesoInicial()+","+loteSementeDTO.getPesoAtual()+","+loteSementeDTO.isFlgEncerrado()+");";
        connector.executeInsertQuery(sql);
    }

    public void atualizaLoteSemente(LoteSementeDTO loteSementeDTO,
                                    boolean atualizaIdColeta,
                                    boolean atualizaPesoInicial) throws SQLException {

        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;

        sql = "UPDATE LOTE_SEMENTE\n" +
              "SET ";

        if (atualizaIdColeta) {
            sql += "Id_Matriz = " + loteSementeDTO.getIdColeta() + "\n";
            naoPossuiAtualizacaoAinda = false;
        }

        if (atualizaPesoInicial) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Peso_Inicial = " + loteSementeDTO.getPesoInicial() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Peso_Inicial = " + loteSementeDTO.getPesoInicial() + "\n";
            }
        }

        sql += "WHERE Id = " + loteSementeDTO.getId() + ";";

        connector.executeUpdateQuery(sql);
    }

}
